﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using BIZMA._controls;
using BIZModel;
using BL.BIZControls;
using System.Configuration;
using System.Web.Security;
using System.Web.Configuration;

namespace BIZMA._controls.Files
{
    public partial class Edit_Folder : BIZEditControl, IBIZControlDefaultMethods
    {
        #region Default load functions
        public void DefaultListLoad()
        {
            throw new NotImplementedException();
        }

        public void DefaultListLoad(Guid Id, string loadByType)
        {
            throw new NotImplementedException();
        }

        public void DefaultEditNew()
        {
            throw new NotImplementedException();
        }
        //man kan bara skapa mappar under en befintlig mapp
        public void DefaultEditNew(Guid Id, string editByType)
        {
            NewFolder(Id);
        }

        public void DefaultEditLoad(Guid Id)
        {
            LoadFolder(Id);
        }


        #endregion

        /// <summary>
        /// ObjectType för role används där typ av objekt ska beskrivas tex i generella metoder där bara ett id och objettype finns
        /// </summary>
        public const string ObjectTypeFolder = "FOLDER";
        /// <summary>
        /// EventType för knappen visa rättigheter
        /// </summary>
        public const string EventTypeOpenPermissions = "OPENPERMISSIONS";


        //Properties för att hålla reda på om en dialog kan öppnas eller om den redan är öppen i en underliggande dialog
        public bool CanAddPermissionDialog { get { return ViewState["CanAddPermissionDialog"] != null ? (bool)ViewState["CanAddPermissionDialog"] : true; } set { ViewState["CanAddPermissionDialog"] = value; } }

        #region Init
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack || !InitLoaded)
            {
                InitLoaded = true;
                //Gör sådant som man gör på pageload här typ fyll "statisk" dropdown med värden mm 
                //Om tabbar används i kontrollen
                //SetTabSize = true; 

            }
        }

        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);
            //här gör man alla init inställningar tex lägga till eventhandlers och annat som styr sidan
            if (ContainerControl != null)
            {
                //Titel på containerkontrollen
                ContainerControl.Title = "Administrera mapp";
                //Event vid klick på knapparna i containerkontrollen
                ContainerControl.ButtonsClick += new ButtonsHandler(ContainerControl_ButtonsClick);
                //Vilka knappar den här kontrollen använder/vill visa från containerkontrollens knappar
                ContainerControl.ShowButtons(true, true, true, true);

                if (ModalContainerControl != null)
                {
                    ModalContainerControl.Width = 700;
                    ModalContainerControl.Height = 470;
                    ModalContainerControl.FormScrollStyleChanged += new EventHandler(ModalContainerControl_FormScrollStyleChanged);
                }

                //Sätt validation group från Containercontrollen så de blir unika på sidan
                val_Name.ValidationGroup = ContainerControl.ValGroupSave;

                //Kontrollera om det går att öppna dialoger så det inte har blivit en loop av underliggande dialoger
                //Används i ToggleButtons()
                CanAddPermissionDialog = mcPermissions.CanAddPopupControl(BIZControl.ObjectRoleList);
            }
            else
            {
                //Om det inte finns någon containercontrol

                //Validation groups för validatorer i kontrollen
                val_Name.ValidationGroup = "SAVE";
            }

            //Registrera event som sker i kontrollen
            btnPerm.Command += new CommandEventHandler(btnPerm_Command);
        }


        #endregion
        #region Container Events
        void ModalContainerControl_FormScrollStyleChanged(object sender, EventArgs e)
        {
            //Sätter samma style (storlek) på FormPart som formscroll så den fyller hela ytan
            oneFormpart.Attributes["style"] = formscroll.Attributes["style"];
        }

        /// <summary>
        /// Triggas vid klick på någon av containerkontrollens knappar
        /// </summary>
        /// <param name="sender">Containerkontrollen</param>
        /// <param name="actionType">Vilken typ av knapp som klickats</param>
        void ContainerControl_ButtonsClick(object sender, ActionType actionType)
        {
            if (actionType == ActionType.Save || actionType == ActionType.SaveClose)
            {
                Save();
            }
            else if (actionType == ActionType.Delete)
            {
                Delete();
            }
        }


        #endregion

        #region Events This Control

        void btnPerm_Command(object sender, CommandEventArgs e)
        {
            if (HandleButtonClick)
            {
                CallHandledButtonClick(this, CurrentId, ObjectTypeFolder, EventTypeOpenPermissions);
            }
            else
            {
                mcPermissions.AddDefaultListLoad(BIZControl.ObjectRoleList, CurrentId, typeof(BIZModel.Folder).FullName);
            }
        }
        #endregion

        #region Methods this dialog



        /// <summary>
        /// Aktiverar/inaktiverar knappar som behöver data eller som inte kan visas pga underliggande dialoger 
        /// </summary>
        private void ToggleButtons()
        {
            //Sätt status om knappen kan visas pga underliggande dialoger
            BaseBL.BtnOpenEnabled(btnPerm, CanAddPermissionDialog, ViewState);

            //Sätt status om knappen kan visas pga data som krävs
            if (CurrentId != Guid.Empty)
            {
                if (CanAddPermissionDialog)
                {
                    BaseBL.BtnNeedsDataEnabled(btnPerm, true, ViewState);
                }
            }
            else
            {
                if (CanAddPermissionDialog)
                {
                    BaseBL.BtnNeedsDataEnabled(btnPerm, false, ViewState);
                }
            }
        }



        /// <summary>
        /// Kör denna metod när en ny mapp ska skapas.
        /// Alla mappar skapas under en befintlig mapp
        /// </summary>
        public void NewFolder(Guid parentId)
        {
            //CurrentProjectId = Guid.Empty;
            selParent.SelectedId = parentId;
            selParent.Reload();
            LoadFolder(Guid.Empty);
        }

        /// <summary>
        /// Kör denna metod när en mapp ska ändras/visas
        /// </summary>
        /// <param name="folderId">Mappen som ska laddas</param>
        public void LoadFolder(Guid folderId)
        {
            InitLoaded = true;
            CurrentId = folderId;


            if (CurrentId != Guid.Empty)
            {
                BIZMAEntities ent = BaseBL.GetEnt();
                BIZModel.Folder folder = ent.Folders.FirstOrDefault(q => q.FolderId == CurrentId);                

                selParent.SelectedId = folder.ParentId.HasValue ? folder.ParentId.Value : Guid.Empty;
                selParent.Reload();

                txtName.Text = folder.FolderName;
                txtValidFrom.Text = folder.ValidFrom.HasValue ? folder.ValidFrom.Value.ToString() : "";
                txtValidTo.Text = folder.ValidTo.HasValue ? folder.ValidTo.Value.ToString() : "";
            }
            else
            {
                txtName.Text = "";
                txtValidFrom.Text = "";
                txtValidTo.Text = "";
            }

            ToggleButtons();
        }

        /// <summary>
        /// Spara
        /// </summary>
        private void Save()
        {
            //SAVE
            if (Page.IsValid)
            {

                BIZMAEntities ent = BaseBL.GetEnt();
                BIZModel.Folder folder = null;

                if (CurrentId == Guid.Empty)
                {
                    CurrentId = Guid.NewGuid();

                    folder = BIZModel.Folder.CreateFolder(CurrentId, 0, txtName.Text, false);
                    folder.ValidFrom = txtValidFrom.Text == "" ? (DateTime?)null : DateTime.Parse(txtValidFrom.Text);
                    folder.ValidTo = txtValidTo.Text == "" ? (DateTime?)null : DateTime.Parse(txtValidTo.Text);
                    folder.CreatedBy = BaseBL.UserId;


                    BIZModel.Folder parent = ent.Folders.FirstOrDefault(q => q.FolderId == selParent.SelectedId);


                   

                    folder.ParentId = parent.FolderId;
                    //hämta parent och kolla rootfolderId
                    //TODO: RootFolder är inte klart ännu
                    //folder.FunctionRootFolder = parent.FunctionRootFolder;
                    folder.Url = parent.Url + "/" + Server.UrlPathEncode(txtName.Text);


                    ent.Folders.AddObject(folder);
                    ent.SaveChanges();
                }
                else
                {
                    

                    folder = ent.Folders.FirstOrDefault(q => q.FolderId == CurrentId);

                    string oldPath = folder.Url;

                    folder.FolderName = txtName.Text;
                    folder.ValidFrom = txtValidFrom.Text == "" ? (DateTime?)null : DateTime.Parse(txtValidFrom.Text);
                    folder.ValidTo = txtValidTo.Text == "" ? (DateTime?)null : DateTime.Parse(txtValidTo.Text);


                    BIZModel.Folder parent = ent.Folders.FirstOrDefault(q => q.FolderId == selParent.SelectedId);
                    folder.ParentId = parent.FolderId;
                    folder.Url = parent.Url + "/" + Server.UrlPathEncode(txtName.Text);

                    string newPath = folder.Url;

                    ent.SaveChanges();

                    ent.Folder_ReplacePath(oldPath, newPath);


                }

                //Ändra aktivering av knappar efter sparning / eller kör load metoden 
                ToggleButtons();
            }
        }

        private void Delete()
        {
            if (CurrentId != Guid.Empty)
            {
                BIZMAEntities ent = BaseBL.GetEnt();
                BIZModel.Folder folder = ent.Folders.FirstOrDefault(q => q.FolderId == CurrentId);
                ent.DeleteObject(folder);
                ent.SaveChanges();
            }

        }






        #endregion

        #region Sub dialog events

        #endregion




    }
}